package skyhyun;

public class J06_Conversions {
	/**
	 *  형변환(Conversions)
	 *  	서로 다른 자료형을 처리할 때 종종 변환이 필요
	 *  	float avg = (float) tot /3;
	 *  
	 *  	두 변수가 같은 자료형이라면 대입은 성공적으로 처리
	 *  	같은 유형으로 변환하는 것을 동질성 변환이라 함
	 *  	하지만, 다른 유형으로의 변환은 성공을 보장 못함
	 *  
	 *  	기본 자료형 변환에는 확대 / 축소 변환이 있음.
	 *  
	 *  확대 형변환(Widening Conversion)
	 *  	int 형에서 long 형으로의 변환처럼 첫번째 유형에 비해 두번째 유형의 크기가 같거나 클때 발생함
	 *  	확대변환시 정보 손실의 위험은 발생하지 않음
	 *  
	 *  축소 형변환(Narrowing Conversion)
	 *  	long 형에서 int 형으로의 변환처럼 첫번째 유형에 비해 두번째 유형의 크기가 작을 때 발생함
	 *  	축소 형변환은 확대 형변환과 달리 명시적이어야 함
	 *  	괄호안에 변환하려는 유형을 지정(cast 연산자)
	 *  	(float)는 컴파일러에게 float 형으로 변환할 것을 지시함
	 *  	축소변환시 정보 손실이 발생할 수 있기 때문에 유의해야 함
	 *  	이것은 프로그램의 결함을 야기함
	 */  
	
	public static void main(String[] args) {
		// 동질성 변환(Identity Conversion)
		int a = 90;
		int b = a; 
		
		// 확대 형변환(Widening Conversion) -> 자동 형변환(promotion)
		long c = a;
		
		// 축소 형변환(Narrowing Conversion) -> 강제 형변환(casting)
		int d = (int)c;
		
		// 축소 형변환으로 인한 정보손실
		long e = 1234567890123L;
		int f = (int)e;
		System.out.println(e);
		System.out.println(f);
		
		// 연산자 우선순위
		int g = 1;
		int h = 2;
		int i = 3;
		int j = g + h * i;
		// 모든 연산자에는 우선순위가 있음
		// 가장 높은 우선 순위는 (), ++, --
		
		int k = 5;
		int l = 5;
		boolean m = k + 5 == l + 20;
		
		// 승격(Promotion)
		byte n = 5;
		// byte o = -n;
		// 놀랍게도 오류 발생!!
		// 단항 연산자 - 에 의해 n 변수가 int 형으로 승격
		// 문제 해결을 위해 명시적 축소 형변환을 사용하거나 변수를 int 형으로 바꾸면 됨
		byte o = (byte) -n;
		int p = -n;
		
		short q = 100;
		short r = 200;
		// short s = q + r;    >>> 오류 발생!!
		// 이항 연산자 + 에 의해서 q, r 변수가 int 형으로 승격
		// 문제 해결을 위해 명시적으로 축소 형변환(byte)을 사용하거나 변수를 int 형으로 바꾸면 됨
		short s = (short)(q + r);
		int t = q + r;
		
		/*	주석(Comments)
		  		프로그램 코드에 덧붙이는 설명문, 해설
		  		주석은 무시하고 넘어감
		  		해당 코드가 제공하는 기능, 용도, 의미를 쉽게 파악하도록 하기 위해 주석을 다는 것은 좋은 습관임
		  		자바에서는 2가지 주석 유형 제공 - C, C++ 과 유사 */
		// 전통적인 주석은 /* 와 */ 사이에 주석을 작성
		//		주의 ) 중첩해서 사용하면 안됨!!
		//		한 줄 주석인 // 는 코드 끝에 작성하는 주석
		
		/*	이 문장은 주석입니다~	*/
		/*	아잉~ 주석이라니깐요	*/
		// 		/*  /*  */  */  처럼 주석을 중첩하면 안됨
		
		// 연결(join) 연산자 + (Concatenate)
		// 		일반적으로 + 연산자는 두 수를 더하는 기능이 있음
		//		하지만 문자나 문자열에 + 연산자를 사용하면 앞의 문자와 뒤의 문자를 연결(합치는)해 줌 
		
		char u = '가';
		char v = '나';
		
		System.out.println( (int)u );
		System.out.println( (int)v );
		System.out.println( u + v );		// 승격으로 인해 숫자 출력
		System.out.println("" + u + v);
		// 하지만, 문자에 사용하는 + 연산자로 인한 오버헤드 때문에 StringBuilder 클래스를 주로 사용   
		
	}
}
